package com.xinqi.modules.user.users.user.service;

import com.xinqi.modules.user.third.dto.req.*;
import com.xinqi.modules.user.user.dto.req.*;
import com.xinqi.modules.user.user.dto.req.v2.UpdatePhoneV2Dto;
import com.xinqi.modules.user.user.dto.rsp.*;
import com.xinqi.common.base.response.PageInfo;
import com.xinqi.common.base.response.Param;
import com.xinqi.modules.user.users.third.domain.UserLoginLogEntity;

import java.util.List;

/**
 * 用户信息服务层
 *
 * @author: wenjie
 * @date: 2023/05/17
 */
public interface UserService {
    /**
     * 分页查询 用户信息数据
     */
    PageInfo<UserResultDTO> page(Param pageable, UserQueryDTO query);

    PageInfo<UserResultDTO> pageAdmin(Param pageable, UserQueryDTO query);

    Boolean updateStatus(UpdateUsersStatusDTO dto);

    Boolean setAdmin(UsersSetAdminDTO dto);

    /**
     * 根据id修改 用户信息数据
     */
    Boolean updateById(UsersUpdateDTO dto);

    UserResultDTO selectById(Long id);

    /*获取用户信息包含密码*/
    UserPasswordResultDTO selectPasswordById(Long id);

    UserResultDTO selectAdminById(Long id);

    Boolean updateUserInfo(UpdateUserDto dto);

    Boolean updateXinqiNumber(String xinqiNumber, Long userId);

    UserResultDTO queryByXinqiNumber(String xinqiNumber);

    Boolean updatePrivacy(SetPrivacyDto dto);

    Boolean updatePhone(UpdatePhoneDto dto);

   /**
    * 更换手机号
    * @version 2.0
    * @author dzy
    */
    Boolean updatePhoneV2(UpdatePhoneV2Dto dto);

    /**
     * 校验手机号码唯一
     *
     * @param phonenumber
     * @param userId
     * @return
     */
    Boolean checkPhoneUnique(String phonenumber, Long userId);

    Boolean bindEmail(UpdateEmailDto dto);

    Boolean checkEmailUnique(String email, Long userId);

    Boolean unbindEmail(UpdateEmailDto dto);

    Boolean resetUserPwd(PasswordChangeDto dto);

    Boolean forgotPassword(ForgotChangeDto dto);

    Boolean authentication(UserAuthenticationDto dto) throws Exception;

    void accountCancel(Long userId);

    UserResultDTO registerXqAppUser(UserRegisterDTO dto);

    List<UserResultDTO> list(UserQueryDTO dto);

    /**
     * 关键字搜索 -- 新奇号、手机号精准查询
     *
     * @param dto
     * @return
     */
    List<SearchFriendResultDTO> selectUsersByKeyword(SearchFriendDTO dto);

    List<UserResultDTO> findList(List<Long> userIds);

    UserResultDTO findByMobile(String mobile);

    List<UserResultDTO> findByMobile(List<String> mobileList);

    UserResultDTO getXqUserInfoByPhone(String mobile);

    UserResultDTO thirdBindUser(UserThirdCheckDTO thirdCheck);

    UserResultDTO registerLastStep(RegisterLastStepDTO lastStep);

    Boolean resetPassword(PasswordResetDTO dto);

    void generateLog(UserLoginLogEntity log);

    /**
     * 校验手机号码是否为新用户
     *
     * @param mobile
     * @return
     */
    Boolean findByMobileIncludeDelete(String mobile);

    /**
     * 校验手机号码获取新用户信息-包含注销用户
     *
     * @param mobile
     * @return
     */
    List<UserBaseInfoDO> findListByMobileIncludeDelete(String mobile);

    UserBaseInfoDO findUserBaseInfo(Long userId);


    UserLoginResultDTO selectLoginMsgByMobile(String mobile);

    /**
     * 账号封禁
     *
     * @param userIds
     * @return
     */
    Boolean accountBan(List<Long> userIds);

    /**
     * 账号解封
     *
     * @param userIds
     * @return
     */
    Boolean accountUnblocking(List<Long> userIds);

    UserLoginResultDTO selectLoginMsgById(Long id);

    /**
     * 注册助手用户
     * @return
     */
    UserResultDTO registerAssistant();

    /**
     * 注册模拟用户
     * @param dto
     * @return
     */
    UserResultDTO imitateRegister(UserImitateDTO dto);

    UserResultDTO findImitateByMobileAndNickname(String mobile, String nickname);

    void imitateUserUpdate(UserImitateUpdateDTO dto);
}
